<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
       //创建promise对象
       const ps = new Promise((resolve,reject)=>{
            console.log("开始请求A数据");
            //try  catch处理内部报错，一旦有报错，catch就会捕捉到
            try{
               //用setTimeout模拟ajax异步请求
               setTimeout(()=>{
                    console.log("A数据请求成功");
                    //模拟请求回来的数据
                    const userName = {
                        user: "张三"
                    }
                    //数据请求成功时返回数据
                    resolve(userName)
               },2000)
            }catch(e){
                //数据请求失败时返回报错信息
                reject(e.message);
            }
       })

       /*
         -返回的时成功状态的promise实例,可以用then 方法处理相关逻辑
         -then底层封装的函数可用来监听promise实例的状态及返回值,若是fulfilled状态,则将其对应的值通过实参的形式赋给形参把value
       */
       .then(value=>{
        return new Promise((resolve,reject)=>{
            console.log("开始请求B数据");
            try{
                setTimeout((e)=>{
                    console.log("定时器",e);
                    console.log("B数据请求成功");
                    //模拟请求回来的B数据
                    const age = {
                        age: 20
                    }
                    // 合并userName和age对象,并在请求成功后返回
                    resolve({
                        ...value,
                        ...age
                    })
                    resolve(Object.assign({},value,age))
                },2000)
            }catch(e){
                reject(e.message);
            }
        })
       })

       .then(value=>{
        // console.log(value);
        console.log("请求数据C");
        return new Promise((resolve,reject)=> {
            try{
            setTimeout(()=>{
                console.log("C数据请求成功");
                // 模拟请求成功的C数据
                const sex = {
                    sex: "女"
                }
                resolve({
                    ...value,
                    ...sex
                })

            })
        }catch(e){
            console.log("catch",e);
            reject(e.message);
        }
       })

       //最后一个then不需要返回promise实例,因为后续没有需要请求的数据
       .then(value => {
        //处理获取到的数据
        console.log(value);
       })
        })
        

    //处理newPromise实例的潜在报错
    .catch(reason => {
        console.log("这里处理异常");
    })
    </script>
</body>
</html>